/**
 * 
 * 散列
 * HashTable 类，也叫 HashMap 类，是 Dictionary 类的一种散列表实现方式。
 * 散列算法的作用是尽可能快地在数据结构中找到一个值。
 * 在上面的例子中，如果要在数据结构中获得一个值（使用get方法），需要遍历整个数据结构来得到它。
 * 如果使用散列函数，就知道值的具体位置，因此能够快速检索到该值，散列函数的作用是给定一个键值，然后返回值在表中的地址。
 */


class HashTable{
	constructor(){
		this.table = [];
	}

	//散列函数(将产生重复值)
	static loseloseHashCode(key){
		let hash = 0;
		for(let codePoint of key){
			hash += codePoint.charCodeAt();
		}
		return hash % 37;
	}
	//散列函数(djb2)
	static djb2HashCode(key) { 
	  let hash = 5381
	  for (let codePoint of key) {
	    hash = hash * 33 + codePoint.charCodeAt()
	  }
	  return hash % 1013
	}

	//修改和增加元素
	put(key, value){
		// const position = HashTable.loseloseHashCode(key);
		const position = HashTable.djb2HashCode(key);
		console.log(`${position} - ${key}`);
		this.table[position] = value;
	}

	get(key){
		// return this.table[HashTable.loseloseHashCode(key)];
		return this.table[HashTable.djb2HashCode(key)];
	}

	remove(key){
		// this.table[HashTable.loseloseHashCode(key)] = undefined;
		this.table[HashTable.djb2HashCode(key)] = undefined;
	}
}


// 测试
const hash = new HashTable();
hash.put('Surmon', 'surmon.me@email.com');
hash.put('John', 'johnsnow@email.com');
hash.put('Tyrion', 'tyrion.me@email.com');

console.log(hash.get('Surmon'));
console.log(hash.get('Loiane'));
console.log(hash);